perm filename PERSP.OLD[CMS,LCS] blob
sn#720324 filedate 1983-07-27 generic text, type T, neo UTF8
C APPLIES PERSPECTIVE TO DRAWING. EDGE OF 'PAPER' MAY BE CURVED.
IMPLICIT INTEGER(X,Y,Z)
COMMON JHALF,F,LB,D,X,Y,DL,HA,HB,R,RX,FACX
DIMENSION X1(800),Y1(800),Z1(800),X6(800)
DIMENSION X2(200),Y2(200),Z2(200),X7(200),Y7(200)
DIMENSION X3(800),Y3(800),X4(200),Y4(200)
1 ,JJ(4000),X5(200),Y5(200)
JHALF=0
1 FORMAT(' TYPE PICTURE NAME '$)
2 FORMAT(' TYPE CURVE NAME '$)
3 FORMAT(' TYPE OUTPUT NAME '$)
6 FORMAT(A5)
7 FORMAT(4I)
8 FORMAT(' TYPE X,Y FOR VANISHING POINT. '$)
9 FORMAT(' TYPE FORESHORTENING FACTOR. '$)
13 FORMAT(6F)
14 FORMAT(6I)
400 FORMAT(' LEFT=',I4,' RT=',I4,' TOP=',I4,' BOT='I4)
401 FORMAT(' TYPE X,Y FOR LOWER LEFT CORNER, X FOR RIGHT CORNER,'/
1' X,Y FOR UPPER LEFT CORNER '$)
C ASSUMES LEVEL BOTTOM FOR 'PIECE OF PAPER'
4 TYPE 1
ACCEPT 6,NM1
TYPE 2
ACCEPT 6,NM2
XL=9999
XR=-XL
YT=XR
YB=XL
20 REWIND 1
REWIND 20
CALL IFILE(1,NM1)
CALL IFILE(20,NM2)
DO 30 KT=1,800
READ(1,7,END=21)LT,X1(KT),Y1(KT),Z1(KT)
X=X1(KT)
Y=Y1(KT)
IF(X.LT.XL)XL=X
IF(X.GT.XR)XR=X
IF(Y.LT.YB)YB=Y
30 IF(Y.GT.YT)YT=Y
C FIND OUTER DIMENSIONS OF PICTURE
21 KT=KT-1
C NOW KT = TOTAL VECTORS
J=X2(1)
JB=J
TYPE 400,XL,XR,YT,YB
LB=Y2(1)
LT=L
DO 40 K=1,800
READ(20,7,END=22)LT,X2(K),Y2(K),Z2(K)
N=X2(K)
IF(N.LT.J)J=N
IF(N.GT.JB)JB=N
C ASSUMES BASE LINE IS LEVEL FOR NOW
N=Y2(K)
IF(N.LT.LB)LB=N
40 IF(N.GT.LT)LT=N
C GETS TOP AND BOT. LT,LB
22 K=K-1
CC IF(LB.GE.0)GO TO 200
CC DO 201 J=1,K
CC201 Y2(J)=Y2(J)-LB
CC DO 202 J=1,KT
CC202 Y1(J)=Y1(J)-LB
C SHIFT ALL TO Y POSITIVE IF ANY NEG POINTS
200 CALL DPYSET(1,JJ,4000)
CALL DRWIT(X2,Y2,Z2,K)
CALL DRWIT(X1,Y1,Z1,KT)
250 FORMAT(' SHIFT PICTURE? '$)
251 FORMAT(' TYPE X SHIFT, Y SHIFT '$)
TYPE 250
ACCEPT 6,XL
IF(XL.NE.'Y')GO TO 252
TYPE 251
ACCEPT 7,XL,LT
DO 253 J=1,KT
X1(J)=X1(J)+XL
253 Y1(J)=Y1(J)+LT
GO TO 200
23 FORMAT(' HORIZONTAL POINTS ARE ',2I4)
24 FORMAT(' VERTICAL POINTS ARE ',2I4)
C TYPE 23,J,JB
C TYPE 24,LB,LT
C ASSUMES TOP AND BOT OF CURVE ARE AT X=0, BOT AT Y=0.
252 TYPE 401
ACCEPT 14,XL,YB,XR,XL2,YT
FA=LT-LB
C HEIGHT OF CURVE (LB SHOULD BE 0)
FB=YT-YB
C HEIGHT OF 'PIECE OF PAPER' (YB SHOULD BE 0)
G=FB/FA
C FACTOR FOR SIZE DIFFERENCE BETWEEN PAPER AND CURVE
C LT=LT*G
LT=JMUL(LT,G)
LB=LB*G
C XL=XH*G+.5
XL=JMUL(XH,G)
C XR=XR*G+.5
CC XR=JMUL(XR,G)
C YT=YT*G+.5
YT=JMUL(YT,G)
C YB=YB*G+.5
YB=JMUL(YB,G)
* SCALE EVERYTHING DOWN
FC=XL2-XL
C OFFSET TO TOP OF SLANTED 'PIECE OF PAPER'
25 DO 15 J=1,K
PC=(Y2(J)-LB)/FA
C % OF WAY UP FROM BOT.
C Y7(J)=G*Y2(J)+.5
Y7(J)=JMUL(Y2(J),G)
C EXPAND Y TO FIT PAPER
Y4(J)=Y7(J)
C X7(J)=X2(J)*G+FC*PC+.5
CCC X7(J)=X2(J)+FC
X7(J)=JMUL(X2(J),G)+FC*PC
C EXPAND X BY SAME FACTOR AND TILT IF NECESSARY
15 X4(J)=X7(J)+XR
C SET UP RIGHT SIDE OF PIECE OF PAPER
CALL DRWIT(X7,Y7,Z2,K)
CALL DRWIT(X4,Y4,Z2,K)
C NOW BEND DRAWING TO FIT GIVEN CURVE
J=1
500 S=X1(J)
T=Y1(J)
DO 501 L=1,K-1
C ASSUMES CURVE GOES BELOW AND ABOVE PICTURE
R=Y7(L)
RR=Y7(L+1)
IF(T.LT.R.OR.T.GT.RR)GO TO 501
C H=X7(L)-X7(L+1)
HA=X7(L)
H=X7(L+1)-HA
C G=(R-T)/(Y2(L+1)-T)
G=(R-T)/(R-Y7(L+1))
C G=% OF WAY BETWEEN POINTS
C X6(J)=HA+S+H*G+.5
HH=HA+S+H*G
IF(HH.GT.0)HH=HH+.5
IF(HH.LT.0)HH=HH-.5
X6(J)=HH
J=J+1
IF(J.LE.KT)GO TO 500
GO TO 502
501 CONTINUE
502 CALL DRWIT(X6,Y1,Z1,KT)
TYPE 8
ACCEPT 7,X,Y
CALL AIVECT(X7(K)-100,Y7(K))
CALL AVECT(X-100,Y)
CALL AVECT(X7(1)-100,Y7(1))
CALL DPYOUT(1)
C SHOWS VANISHING POINT
TYPE 9
ACCEPT 13,F
IF(F.EQ.0)F=1
HA=Y7(K)-Y
C HEIGHT FROM VP TO TOP OF RECT.
HB=Y7(1)-Y
C HEIGHT FROM VP TO BOT OF RECT.
DL=X-X7(1)
C LENGTH FROM LEFT EDGE OF RECT. TO VP
M1=1
C GET FIRST POINTS
C G,LT=TOP OF RECT. H,LB=BOT OF RECT.
G=LT
H=LB
D=G-H
C D=HEIGHT OF RECT.
F=F*XR/DL
C FORESHORTENING FACTOR IS CHANGED BE RELATION OF SEGMENT ACROSS
C VANISHING POINT LINES AT RIGHT EDGE OF PIECE OF PAPER.
32 DO 31 J=1,K
31 CALL FORSH(X7(J),Y7(J),X7(J),Y7(J))
27 DO 26 J=1,K
26 CALL FORSH(X4(J),Y4(J),X5(J),Y5(J))
CALL DRWIT(X5,Y5,Z2,K)
28 DO 10 M1=1,KT
10 CALL FORSH(X6(M1),Y1(M1),X3(M1),Y3(M1))
12 CALL DRWIT(X3,Y3,Z1,KT)
300 FORMAT(' WRITE FILE? '$)
TYPE 300
ACCEPT 6,J
IF(J.NE.'Y')GO TO 301
TYPE 3
ACCEPT 6,J
CALL OFILE(21,J)
IF(JHALF.NE.0)GO TO 304
DO 302 J=1,KT
302 WRITE(21,7)J,X3(J),Y3(J),Z1(J)
C WRITES FILE TO BE USED WITH 'RE' IN THE DRW PROGRAM.
J=KT
DO 306 JK=1,K
J=J+1
306 WRITE(21,7)J,X5(JK),Y5(JK),Z2(JK)
DO 307 JK=1,K
J=J+1
307 WRITE(21,7)J,X7(JK),Y7(JK),Z2(JK)
J=J+1
JK=1
WRITE(21,7)J,X5(1),Y5(1),JK
J=J+1
JL=0
WRITE(21,7)J,X7(1),Y7(1),JL
J=J+1
WRITE(21,7)J,X5(K),Y5(K),JK
J=J+1
WRITE(21,7)J,X7(K),Y7(K),JL
303 JHALF=0
END FILE 21
301 CALL HYDPOG(1)
GO TO 200
304 DO 305 J=1,KT
C HALF SIZE IF X OR Y .GE.1000
LX=X3(J)/2
LY=Y3(J)/2
305 WRITE(21,7)J,LX,LY,Z1(J)
GO TO 303
END
SUBROUTINE DRWIT(X,Y,Z,K)
INTEGER X,Y,Z
DIMENSION X(1),Y(1),Z(1)
DO 1 J=1,K
IF(Z(J).EQ.0)GO TO 2
CALL AIVECT(X(J)-100,Y(J))
GO TO 1
2 CALL AVECT(X(J)-100,Y(J))
1 CONTINUE
CALL DPYOUT(1)
END
SUBROUTINE FORSH(XA,YA,XB,YB)
IMPLICIT INTEGER (X,Y)
COMMON JHALF,F,LB,D,X,Y,DL,HA,HB,R,RX,FACX
C D=HEIGHT OF 'PIECE OF PAPER', DL=DIST. FROM LEFT EDGE TO VP.
C SET NEW X VALUE FOR THIS POINT
A=DL-XA
XB=(DL-A*A/DL)*F
C FORESHORTENING FORMULA
2 A=1.0-XB/DL
C NOW GET VERTICAL SEG. FOR ALTERED X VALUE
B=A*HA+Y
C=A*HB+Y
3 FAC=(B-C)/D
C FACTOR FOR Y VALUE
C YB=YA*FAC+C+.5
CC=YA*FAC+C
IF(CC.LT.0)CC=CC-.5
IF(CC.GT.0)CC=CC+.5
YB=CC
4 IF(IABS(YB).GE.1000)JHALF=-1
IF(IABS(XB).GE.1000)JHALF=-1
END
FUNCTION JMUL(N,R)
A=N*R
IF(A.LT.0)A=A-.5
IF(A.GT.0)A=A+.5
JMUL=A
END